package ar.republicagroup.gestion.dao.jpa;

import ar.republicagroup.gestion.dao.CierreCajaDAO;
import ar.republicagroup.gestion.entities.Caja;
import ar.republicagroup.gestion.entities.CierreCaja;
import ar.republicagroup.gestion.util.JPAUtil;
import ar.republicagroup.gestion.util.UserSession;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.log4j.Logger;

/**
 *
 * @author DIEGOALV
 */
public class CierreCajaDAOImplJPA implements CierreCajaDAO{

    private EntityManager		 em;
    private Logger log = Logger.getLogger(CierreCajaDAOImplJPA.class);
    
    public CierreCajaDAOImplJPA(){
        em = JPAUtil.getEntityManager();
    }
    
    @Override
    public String insert(CierreCaja beanCierreCaja) {
        
         if(!em.isOpen()){ em = JPAUtil.getEntityManager(); }
         
                String resultado = null;
		
                try
                {
                    em.getTransaction().begin();
                    em.persist(beanCierreCaja);
                    em.getTransaction().commit();
                    resultado = "Cerrando caja...";
                    log.info(UserSession.getInstance().getUser_name()+"("+UserSession.getInstance().getUser_id()+")" 
                                + "---> Cerrando caja del día : "+beanCierreCaja.getFechaCaja());
		}catch(Exception ex){
                    em.getTransaction().rollback();
                    log.error("Error al cerrar caja", ex);
			
		}
	
		return resultado;
        
        
    }

    @Override
    public String update(CierreCaja beanCierreCaja) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public CierreCaja get(Integer idcierreCaja) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String delete(Integer idcierreCaja) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public CierreCaja getCierreCajaByFecha(Calendar fechaCaja) {
            
            CriteriaBuilder qb              = em.getCriteriaBuilder();
            CriteriaQuery cq                = qb.createQuery();
            Root<CierreCaja> cierreCaja     = cq.from(CierreCaja.class);
            List<Predicate> predicates      = new ArrayList<>();
            
            
            if(fechaCaja != null){
               predicates.add( qb.equal(cierreCaja.get("fechaCaja").as(Date.class), fechaCaja.getTime()));
            }

            predicates.add(qb.equal(cierreCaja.get("estado"), 1));
            cq.select(cierreCaja).where(predicates.toArray(new Predicate[]{}));
            
            CierreCaja cajaDelDia = null;
            
            try{
                cajaDelDia = (CierreCaja)em.createQuery(cq).getSingleResult();
            }catch(Exception ex){
                log.error("No se encontró cierre de caja con fecha : "+fechaCaja.getTime());
            }
            
            return cajaDelDia;
    }
    
}
